package eightDataType;

/**
 * @author Ajie
 * @date 10/16/24
 * @function
 */
import java.nio.charset.StandardCharsets;

public class StringTypeChecker {
    public static void main(String[] args) {
        // 示例字节数组，假设为 utf-8 编码
//        byte[] remainingData = {(byte) 0xe4, (byte) 0xb8, (byte) 0xad, (byte) 0xe6, (byte) 0x96, (byte) 0x87}; // "中文"
        byte[] remainingData = {(byte) 0xff}; // "中文"
//        byte[] remainingData = "http://baidu.com.cn?".getBytes(); // "中文"

        // 将字节数组转换为字符串，假设使用 UTF-8 编码
        String str = new String(remainingData, StandardCharsets.UTF_8);
        str=" 4260351680320 ";
        str = str.trim();

        str ="6971704683322";
        byte[] bytes = ByteUtil.hexStrToBytes("363937313730343638333332320d0d");
//        byte[] bytes = ByteUtil.hexStrToBytes("36393731373034363833333232");
        System.out.println("StringTypeChecker:main:"+new String(bytes));
        bytes = ByteArrayCutter.removeCarriageReturns(bytes);
        isCorrectNum(new String(bytes),bytes);

        System.out.println("转换后的字符串: " + new String(bytes));

    }


    public static boolean isCorrectNum(String str,byte[] bytes){
        if (str == null || str.length() < 2 )return false;
        str = str.trim();

        // 判断字符串类型
        if (isChinese(str)) {
            System.out.println("字符串是中文");
        } else if (isEnglish(str)) {
            System.out.println("字符串是英文");
        } else if (isSymbol(str)) {
            System.out.println("字符串是符号");
//        } else if (isNumber(str)) {
//        } else if (isNumber2(str)) {
        } else if (isByteArrayNumeric(bytes)) {
            System.out.println("字符串是数字");
        } else if (isURL(str)) {
            System.out.println("字符串是 URL");
        } else if (isGarbled(str)) {
            System.out.println("字符串可能是乱码:"+str);
            return false;
        } else {
            System.out.println("无法识别的字符串类型:"+str);
            return false;
        }
        return true;
    }

    // 判断是否为中文字符
    public static boolean isChinese(String str) {
        return str.matches("[\\u4e00-\\u9fa5]+");
    }

    // 判断是否为英文字母
    public static boolean isEnglish(String str) {
        return str.matches("[a-zA-Z]+");
    }

    // 判断是否为符号
    public static boolean isSymbol(String str) {
        return str.matches("[\\p{Punct}]+");
    }

    // 判断是否为数字
    public static boolean isNumber(String str) {
        // 去掉不可见字符，例如 \r, \n 等
        str = str.replaceAll("\\p{C}", "");
        return str.matches("\\d+");
    }
    // 判断是否为数字
    public static boolean isNumber2(String str) {
        if (str == null || str.isEmpty()) {
            return false;
        }

        System.out.println("StringTypeChecker:isNumber2:"+str.length());
        for (int i = 0; i < str.length(); i++) {

            if (!Character.isDigit(str.charAt(i))) {
                System.out.println("isNumber:" + str + ", res: false,index:"+i+",chatat:"+str.charAt(i));
                return false;  // 如果有一个字符不是数字，则返回false
            }
        }

        return true;  // 如果所有字符都是数字，返回true
    }
    /**
     * 判断 byte[] 数组是否表示一个数字字符串
     *
     * @param data 要判断的 byte[] 数组
     * @return 如果 byte[] 表示数字字符串，返回 true
     */
    public static boolean isByteArrayNumeric(byte[] data) {
        int length = data.length;

//         如果最后一个字节是 0x0D（回车符），忽略掉它
//        if (length > 0 && data[length - 1] == 0x0D) {
//            length--; // 不处理最后的 0x0D
//        }

        // 检查每个字节是否在 '0' (0x30) 到 '9' (0x39) 之间
        for (int i = 0; i < length; i++) {
            if (data[i] < 0x30 || data[i] > 0x39) {
                return false; // 如果遇到非数字字符，返回 false
            }
        }
        return true; // 所有字节都是数字
    }

    // 判断是否为 URL
    public static boolean isURL(String str) {
        return str.matches("^(http|https)://[^\\s]+$");
    }

    // 判断是否为乱码，通过检测非打印字符
    public static boolean isGarbled(String str) {
        for (char c : str.toCharArray()) {
            // 如果字符不是中文、英文、符号等可打印字符，则可能是乱码
            if (!Character.isLetterOrDigit(c) && !Character.isWhitespace(c) && !isSymbol(String.valueOf(c))) {
                return true;
            }
        }
        return false;
    }
}